iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0

當多個行程並行(concurrent)處理共享的資料時,共享資料同時被不同 Process / threads 存取,因為執行順序的不確定性,很容易發生資料不一致(data inconsistency)的狀況,所以需要額外的機制來確保程式的正確性,也就是同步(Synchronization)。

以下為常見的 Consumer & Producer Problem

每當一個新的 item 被加入緩衝區時,counter 便被加 1,而每當從我們緩衝區移去一個 item 時,counter 便被減 1。
https://ithelp.ithome.com.tw/upload/images/20241004/20168766gprfDVWqdJ.png

當這兩個行程並行執行時可能不會正確地工作,假設現在 counter = 5:

counter++ 可用下列機器語言來實現

register1 = counter
register1 = register1 + 1
counter = register1

counter-- 可用下列機器語言來實現

register2 = counter
register2 = register2 - 1
counter = register2

register1、register2 是一個區域性 CPU 的暫存器。
https://ithelp.ithome.com.tw/upload/images/20241004/20168766kNqsfT3fjl.png
在上圖中我們得到 counter == 4,紀錄有四個填滿的緩衝區而實際上卻有五個填滿的緩衝區。如果先執行 T5 再執行 T4,我們將得到 counter == 6。像這種數個行程同時存取和處理相同資料的情況,而且執行的結果取決於存取時的特殊順序,就叫競爭情況(race condition)。

參考:


上一篇
ch5圖5.20-POSIX即時排班API
下一篇
ch6-臨界區間(Critical Section)問題
系列文
十年後重讀作業系統恐龍本30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言